package com.haojin.java1;

import org.junit.Test;

/*
 * 一、异常处理：抓抛模型
 * 
 * 过程一：“抛”：程序在正常执行的过程中，一旦出现异常，就会在异常代码处生成一个对应异常类的对象
 *              并将此对象抛出
 *              一旦抛出对象以后，其后代码不再执行。
 *              
 *        关于异常对象的产生：①系统自动生成异常对象
 *                           ②手动的自动生成一个异常对象，并抛出（throw）
 *                                 
 *              
 * 过程二：“抓”：可以理解为异常处理的方式：①try-catch-finally   ②throws
 * 
 * 
 * 二、try-catch-finally的使用
 * 
 * try{
 *     //可能出现异常的代码
 * }catch(异常类型1 变量名1 ){
 *     //处理异常的方式1     
 * }catch(异常类型2 变量名2 ){
 *     //处理异常的方式2     
 * }catch(异常类型3 变量名3 ){
 *     //处理异常的方式3     
 * }catch(异常类型4 变量名4 ){
 *     //处理异常的方式4     
 * }
 * .........
 * finally{
 *         //一定会执行的代码
 * }
 * 说明：
 * 1.finally可选择不写
 * 2.使用try将可能出现的异常代码包装起来，在执行过程中，一旦出现异常，就会生成一个对应异常类的对象，
 *   根据此对象的类型，去catch中进行匹配
 * 3.一旦try中的异常对象匹配到某一个catch时，就进入catch中进行异常的处理，一旦处理完成，就跳出当前的
 *   try-catch结构（没有写finally的情况下！）。继续执行其后的代码。
 * 4.catch中的异常类型，如果不满足子父类关系，则声明的顺序无所谓，
 *   如果catch中的异常类型满足子父类关系，则要求子类一定声明在父类的上面，否则报错
 * 5.常用的异常对象处理方式：①String getMessage();  ②PrintStackTrace();
 * 6.在try结构中声明的变量，在出了try结构后，就不能被调用了  
 * 7.try-catch-finally操作可以在finally中嵌套
 * 
 * 体会1：使用try-catch-finally处理编译时异常，使得程序在编译时就不再报错，但是运行时仍可能报错。
 * 
 * 体会2：开发中，运行时异常比较常见，我们通常不针对运行时异常编写try-catch-finally了
 *        针对编译时异常，我们一定要考虑异常的处理
 * 
 * 
 */
public class ExceptionTest1 {

	@Test
	public void test(){
		String str = "123";
		str = "abc";
		int a = 0;
		try{
			a = Integer.parseInt(str);
			
			System.out.println("hello--------1");
		}catch(NullPointerException e){
			System.out.println("出现了空指针异常，不要着急.....");
		}catch(NumberFormatException e){
			System.out.println("出现数值转换异常了，不要着急.....");
		}catch(Exception e){
			System.out.println("出现异常了，不要着急.....");
		}
		a = 20;
		System.out.println("hello-------2");
	}
}
